



//class MyClass
//{
//public:
//	int ADD(int x = 1, int y = 2);
//
//private:
//
//	int _x;
//	int _y;
//};
//
//int MyClass::ADD(int x , int y)
//{
//	_x = x;
//	_y = y;
//	return _x + _y;
//}

//
//int main()
//{
//	MyClass my;
//	
//	int ret= my.ADD();
//	cout << ret << endl;
//	return 0;
//}


//class fun
//{
//public:
//	int ADD()
//	{
//		return 1;
//	}
//	int  ADD(int x = 1,int y = 1)
//	{
//		return x + y;
//	}
//
//	void siz() {
//
//	}
//};
//
//int main()
//{
//	fun s;
//
//	cout << sizeof(s) << endl;
//	return 0;
//}


//
//class  my
//{
//public:
//	void ADD(int x, int y) {
//		_x = x;
//		_y = y;
//		this->_x = x;
//		this->_y = x;
//	}
//	void ass(){
//		cout << _x <<'.' << _y << endl;
//	}
//
//private:
//	int _x;
//	int _y;
//};
//
//int main()
//{
//	my st;
//	my tt;
//	st.ADD(2024, 12);
//	st.ass();
//
//	cout<<endl;
//
//	tt.ADD(2025, 1);
//	tt.ass();
//	return 0;
//}
#include <assert.h>

#include<iostream>
using namespace std;
typedef int StackType;

class Stack
{
public:


	void Print()
	{
		cout  << "/" << _capacity << "/" << _size << endl;
	}


	void Init(int n = 4)
	{
		_a = (StackType*)malloc(sizeof(StackType) * n);
		if (nullptr == _a)
		{
			perror("malloc fail");
			return;
		}
		_capacity = n;
		_size = 0;
	}
	void Push(StackType x)
	{
		if (_size == _capacity)
		{
			int newcapacity = _capacity * 2;
			StackType* tem = (StackType*)realloc(_a, newcapacity * sizeof(StackType));
			if (tem == nullptr)
			{
				perror("realloc fail");
				return;
			}
			_a = tem;
			_capacity = newcapacity;
		}

		_a[_size] = x;
		_size++;
	}
	void Pop()
	{
		assert(_size > 0);
		_size--;
	}
	bool Empty()
	{
		return _size == 0;
	}

	int Top()
	{
		assert(_size > 0);
		return _a[_size - 1];
	}

	void Destroy()
	{
		free(_a);
		_a = nullptr;
		_size = _capacity = 0;
	}

private:
	StackType* _a;
	int _capacity;
	int _size;
};

int main()
{
	Stack st;
	st.Print();
	st.Init();
	st.Push(1);
	st.Push(2);
	st.Push(3);
	st.Push(4);
	st.Push(5);
	/*st.Pop();
	st.Pop();
	st.Pop();
	st.Pop();
	st.Pop();
	st.Pop();*/

	while (!st.Empty())
	{
		printf("%d ", st.Top());
		st.Pop();
	}

	/*int*& p = (int*)NULL;*/
	int* a = nullptr;
	int* &b = a;

	st.Destroy();
	return 0;
}